package com.glsc.ngateway.opmanage.service.outsys;


import com.glsc.ngateway.common.api.common.utils.PageUtil;
import com.glsc.ngateway.common.base.domain.mysql.opmanagemain.outsys.OutSystemTemplateItem;
import com.glsc.ngateway.common.base.domain.mysql.opmanagemain.outsys.OutSystemTemplateRel;
import com.glsc.ngateway.common.base.repo.mysql.opmanagemain.outsys.OutSystemTemplateItemRepository;
import com.glsc.ngateway.opmanage.dto.OutSystemAuthDto;
import com.glsc.ngateway.opmanage.utils.SpecificationUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.data.domain.*;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

@Service
@Slf4j
public class OutSystemTemplateItemService {

    @Resource
    private OutSystemTemplateItemRepository itemRepository;

    @Resource
    private OutSystemTemplateRelService relService;

    /**
     * 分页
     *
     * @param pageNo
     * @param pageSize
     * @param param
     * @return
     */
    public Page<OutSystemTemplateItem> page(int pageNo, int pageSize, Map<String, Object> param) {
        Sort.Direction direction = Sort.Direction.DESC;
        String sort = "createTime";

        pageNo = PageUtil.initPageNo(pageNo);
        pageSize = PageUtil.initPageSize(pageSize);

        Pageable pageable = PageRequest.of(pageNo - 1, pageSize, direction, sort);
        Page<OutSystemTemplateItem> page = itemRepository.findAll(SpecificationUtil.buildSpecification(param, OutSystemTemplateItem.class), pageable);
        return page;
    }

    /**
     * 保存
     *
     * @param obj
     * @return
     */
    public OutSystemTemplateItem save(OutSystemTemplateItem obj) {
        return itemRepository.save(obj);
    }

    public List<OutSystemTemplateItem> saveAll(List<OutSystemTemplateItem> list) {
        return itemRepository.saveAll(list);
    }

    /**
     * 保存权限项配置
     *
     * @param dto
     */
    public void saveAuthConfig(OutSystemAuthDto dto) {
        if (CollectionUtils.isEmpty(dto.getCheckIdList())) {
            return;
        }
        OutSystemTemplateRel relInfo = relService.findSimpleInfoById(dto.getId());
        List<OutSystemTemplateItem> items = listByTemplateIdAndSysId(relInfo.getTemplateId(), relInfo.getSysId());
        if (CollectionUtils.isNotEmpty(items)) {
            for (OutSystemTemplateItem item : items) {
                item.setStatus("N");
                if (dto.getCheckIdList().contains(item.getId())) {
                    item.setStatus("Y");
                }
            }
        }
        itemRepository.saveAll(items);
    }


    /**
     * 根据模板id和系统id查询所有的权限项信息
     *
     * @param templateId
     * @param sysId
     * @return
     */
    public List<OutSystemTemplateItem> listByTemplateIdAndSysId(Integer templateId, Integer sysId) {
        return itemRepository.findAll(Example.of(OutSystemTemplateItem.builder().templateId(templateId).sysId(sysId).build()));
    }

    public List<OutSystemTemplateItem> listByAuthId(Integer authId) {
        return itemRepository.findAll(Example.of(OutSystemTemplateItem.builder().authId(authId).build()));
    }

    /**
     * 根据地查找
     *
     * @param id
     * @return
     */
    public OutSystemTemplateItem findById(Integer id) {
        Optional<OutSystemTemplateItem> optional = itemRepository.findById(id);
        if (optional.isPresent()) {
            return optional.get();
        }
        return null;
    }

    /**
     * 根据id删除
     *
     * @param id
     */
    public void deleteById(Integer id) {
        itemRepository.deleteById(id);
    }

    public void deleteByTemplateIdAndSystemId(Integer templateId, Integer systemId) {
        List<OutSystemTemplateItem> items = listByTemplateIdAndSysId(templateId, systemId);
        if (CollectionUtils.isNotEmpty(items)) {
            itemRepository.deleteAllById(items.stream().map(OutSystemTemplateItem::getId).collect(Collectors.toList()));
        }
    }


}
